Add map_domain_pages/unmap_domain_pages to map contiguous
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 6 Dec 2005 14:52:51 +0000 (15:52 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 6 Dec 2005 14:52:51 +0000 (15:52 +0100)
multi-franme extents of domain memory.

Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/x86_32/domain_page.c
xen/include/xen/domain_page.h

index 7b091d986953f91458c911284c9380d233ed126e..f7c194b775de9169a8f166ca1bdf6ef3657f2bfc 100644 (file)
@@ -40,10 +40,10 @@ static void flush_all_ready_maps(void)
             cache[i] = l1e_empty();
 }
 
-void *map_domain_page(unsigned long pfn)
+void *map_domain_pages(unsigned long pfn, unsigned int order)
 {
     unsigned long va;
-    unsigned int idx, cpu = smp_processor_id();
+    unsigned int idx, i, flags, cpu = smp_processor_id();
     l1_pgentry_t *cache = mapcache;
 #ifndef NDEBUG
     unsigned int flush_count = 0;
@@ -72,10 +72,15 @@ void *map_domain_page(unsigned long pfn)
             local_flush_tlb();
             shadow_epoch[cpu] = ++epoch;
         }
+
+        flags = 0;
+        for ( i = 0; i < (1U << order); i++ )
+            flags |= l1e_get_flags(cache[idx+i]);
     }
-    while ( l1e_get_flags(cache[idx]) & _PAGE_PRESENT );
+    while ( flags & _PAGE_PRESENT );
 
-    cache[idx] = l1e_from_pfn(pfn, __PAGE_HYPERVISOR);
+    for ( i = 0; i < (1U << order); i++ )
+        cache[idx+i] = l1e_from_pfn(pfn+i, __PAGE_HYPERVISOR);
 
     spin_unlock(&map_lock);
 
@@ -83,11 +88,12 @@ void *map_domain_page(unsigned long pfn)
     return (void *)va;
 }
 
-void unmap_domain_page(void *va)
+void unmap_domain_pages(void *va, unsigned int order)
 {
-    unsigned int idx;
+    unsigned int idx, i;
     ASSERT((void *)MAPCACHE_VIRT_START <= va);
     ASSERT(va < (void *)MAPCACHE_VIRT_END);
     idx = ((unsigned long)va - MAPCACHE_VIRT_START) >> PAGE_SHIFT;
-    l1e_add_flags(mapcache[idx], READY_FOR_TLB_FLUSH);
+    for ( i = 0; i < (1U << order); i++ )
+        l1e_add_flags(mapcache[idx+i], READY_FOR_TLB_FLUSH);
 }
index f20e3f28c3b29c24dfaa20687d80f645dd7a520a..ce152aece2a33cc0f053c696b3da149593f4e196 100644 (file)
 #include <xen/config.h>
 #include <xen/mm.h>
 
+#define map_domain_page(pfn)   map_domain_pages(pfn,0)
+#define unmap_domain_page(va)  unmap_domain_pages(va,0)
+
 #ifdef CONFIG_DOMAIN_PAGE
 
 /*
- * Maps a given page frame, returning the mmap'ed virtual address. The page is 
- * now accessible until a corresponding call to unmap_domain_page().
+ * Maps a given range of page frames, returning the mapped virtual address. The
+ * pages are now accessible until a corresponding call to unmap_domain_page().
  */
-extern void *map_domain_page(unsigned long pfn);
+extern void *map_domain_pages(unsigned long pfn, unsigned int order);
 
 /*
- * Pass a VA within a page previously mapped with map_domain_page().
- * That page will then be removed from the mapping lists.
+ * Pass a VA within the first page of a range previously mapped with
+ * map_omain_pages(). Those pages will then be removed from the mapping lists.
  */
-extern void unmap_domain_page(void *va);
+extern void unmap_domain_pages(void *va, unsigned int order);
 
 #define DMCACHE_ENTRY_VALID 1U
 #define DMCACHE_ENTRY_HELD  2U
@@ -84,8 +87,8 @@ domain_mmap_cache_destroy(struct domain_mmap_cache *cache)
 
 #else /* !CONFIG_DOMAIN_PAGE */
 
-#define map_domain_page(pfn)                phys_to_virt((pfn)<<PAGE_SHIFT)
-#define unmap_domain_page(va)               ((void)(va))
+#define map_domain_pages(pfn,order)         phys_to_virt((pfn)<<PAGE_SHIFT)
+#define unmap_domain_pages(va,order)        ((void)((void)(va),(void)(order)))
 
 struct domain_mmap_cache { 
 };